package com.njupt.simulation.utils;

import java.text.NumberFormat;

public class InferenceIndicator {

    /**
     * 计算载波功率方法  dB为单位
     * @param pt 受扰链路发射功率  dBw
     * @param gt 受扰链路发射增益dB
     * @param gr 受扰链路中被干扰对象的接收增益dB
     * @param Lf 自由空间传播损耗dB
     * @param A_l 大气衰减dB
     * @return  载波功率
     */
    public static double caculatecarrier(double pt,double gt, double gr,double Lf,double A_l){
        //pt发射功率    gt发射增益  gr接受增益  Lf自由空间传播损耗  A_p雨衰   A_l 大气衰减
        double carrier;
        if(A_l == -1){
            carrier = pt+gt+gr-Lf;
        }else  {
            carrier = pt+gt+gr-Lf-A_l;
        }
        //根据前端用户的选择不同的传播模型，未选的传播损耗置为0
        return carrier;
    }


    /**
     * 计算一个施扰源的干扰功率方法  dB为单位
     * @param pt 重叠带宽功率dBW
     * @param gt 干扰源发射增益dB
     * @param gr 被干扰对象接收增益dB
     * @param Lf 自由空间传播损耗dB
     * @param A_l 大气衰减dB
     * @return 干扰功率
     */
    public static double caculateinterference(double pt,double gt, double gr,double Lf,double A_l){
        //pt  等效发射功率
        double Interference;
        if(A_l == -1){
            Interference = pt+gt+gr-Lf;
        }else  {
            Interference = pt+gt+gr-Lf-A_l;
        }
        double Interference1 = Math.pow(10,Interference/10);//真值
        return Interference1;
    }

    /**
     * 计算噪声功率方法 dB为单位
     * @param T  等效噪声温度 K
     * @param B  接收机工作带宽MHz  通过频率上下限计算得到的带宽
     * @return  噪声功率
     */
    public static double caculatenoise(double T,double B){
        //T为等效噪声温度    B为带宽
        double K=1.38*Math.pow(10,-23);   //玻尔兹曼常数
        double Noise = K*T*B*Math.pow(10,6);
        double Noise_B = 10*Math.log10(Noise);
        return Noise_B;
    }

    /**
     * 计算deltaT  真值
     * @param pt 干扰源发射功率dB
     * @param gt 干扰源发射增益dB
     * @param gr 被干扰对象接收增益dB
     * @param Lf 自由空间传播损耗dB
     * @param A_p 雨衰dB
     * @param A_l 大气衰减dB
     * @return 等效噪声温度增量的真值
     */
    public static double caculateTbian_T(double pt,double gt, double gr,double Lf,double A_p,double A_l){
        double pt1 = Math.pow(10,pt/10);
        double gt1 = Math.pow(10,gt/10);
        double gr1 = Math.pow(10,gr/10);
        double Lf1 = Math.pow(10,Lf/10);
        double A_p1 = Math.pow(10,A_p/10);
        double A_l1 = Math.pow(10,A_l/10);
        double Tbian_T = (pt1*gt1*gr1)/(Lf1*A_p1*A_l1);
        return Tbian_T;
    }

    public static void main(String[] args) {
        NumberFormat nf = NumberFormat.getPercentInstance();
        nf.setMaximumFractionDigits(2);
        double carrier= caculatecarrier(25.0,60.0,31.0,206.75162267510748,0.0);
        double interference1 = caculateinterference(15.0,10,10,8.8779562704555,100);
        double interference2 = caculateinterference(18.75,40.0,29.942645119704814,206.631422010224,0.0);
        double interferencefinal = 10*Math.log10(interference1+interference2);
        double noise = caculatenoise(290,90);


        // 打印结果
        System.out.println("载波功率：" + carrier);
        System.out.println("干扰功率：" + interference1);
        System.out.println("集总干扰功率：" + interferencefinal);
        System.out.println("噪声功率：" + noise);
        double cn = carrier-noise;
        double in = interferencefinal-noise;
        double Tbian_T = Math.pow(10,in/10);
        String value = nf.format(Tbian_T);
        double cin = 10*Math.log10(Math.pow(10,carrier/10)/(Math.pow(10,noise/10)+Math.pow(10,interferencefinal/10)));
        double ci = carrier - interferencefinal;
        System.out.println("载噪比：" + cn);
        System.out.println("载干比：" + ci);
        System.out.println("干噪比：" + in);
        System.out.println("载干噪比：" + cin);
        System.out.println("等效噪声温度增量：" + value);


    }
}
